#pragma once

#include <string>
#include <vector>

namespace MessageFramework {

/**
 * @brief 消息加密助手（AES-256-GCM）
 *
 * 加密算法：AES-256-GCM（认证加密）
 * - 密钥长度：256 bits (32 bytes)
 * - IV长度：96 bits (12 bytes)
 * - Tag长度：128 bits (16 bytes)
 *
 * 特性：
 * - 机密性：防止窃听
 * - 完整性：防止篡改（GCM模式自带认证）
 * - 性能：硬件加速支持（AES-NI）
 *
 * 加密流程：
 * 1. 生成随机IV（每次加密都不同）
 * 2. AES-256-GCM加密
 * 3. 输出格式：IV(12字节) + Ciphertext + Tag(16字节)
 * 4. Base64编码（方便传输）
 */
class EncryptionHelper {
public:
    static constexpr int AES_KEY_SIZE = 32;    ///< AES-256密钥长度（字节）
    static constexpr int AES_IV_SIZE = 12;     ///< GCM模式IV长度（字节）
    static constexpr int AES_TAG_SIZE = 16;    ///< GCM认证标签长度（字节）

    /**
     * @brief 加密消息体
     *
     * @param plaintext 明文
     * @param key 加密密钥（32字节）
     * @return 密文（Base64编码：IV + Ciphertext + Tag）
     */
    static std::string encrypt(const std::string& plaintext, const std::string& key);

    /**
     * @brief 解密消息体
     *
     * @param ciphertext 密文（Base64编码）
     * @param key 加密密钥（32字节）
     * @return 明文（解密失败返回空字符串）
     */
    static std::string decrypt(const std::string& ciphertext, const std::string& key);

    /**
     * @brief 生成随机加密密钥
     *
     * @return 32字节密钥（Hex编码）
     */
    static std::string generateKey();

    /**
     * @brief 生成随机IV
     *
     * @return 12字节IV
     */
    static std::vector<unsigned char> generateIV();

    /**
     * @brief Base64编码
     */
    static std::string base64Encode(const std::vector<unsigned char>& data);

    /**
     * @brief Base64解码
     */
    static std::vector<unsigned char> base64Decode(const std::string& encoded);

private:
    /**
     * @brief AES-256-GCM加密（内部实现）
     */
    static std::vector<unsigned char> aesGcmEncrypt(
        const std::string& plaintext,
        const std::vector<unsigned char>& key,
        const std::vector<unsigned char>& iv,
        std::vector<unsigned char>& tag);

    /**
     * @brief AES-256-GCM解密（内部实现）
     */
    static std::string aesGcmDecrypt(
        const std::vector<unsigned char>& ciphertext,
        const std::vector<unsigned char>& key,
        const std::vector<unsigned char>& iv,
        const std::vector<unsigned char>& tag);
};

} // namespace MessageFramework
